﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Services;
using EFramework.Web.Validation;

namespace RzCorportativo
{
    public partial class _Default : System.Web.UI.Page
    {
        protected List<Lib.Notificacao> Notificacoes
        {
            get
            {
                return Session["$notificacoes"] as List<Lib.Notificacao>;
            }
            set
            {
                Session["$notificacoes"] = value;
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (this.IsPostBack)
                return;
            if ("s".Equals(this.Request["op"]))
            {
                BasePage.Sair();
                CarregarVagasAbertas();
                return;
            }
            if ("ad".Equals(this.Request["op"]))
            {
                Alert alert = new Alert("erroGeral", this);
                alert.Add("errorAccessDenied", "<strong>Desculpe, acesso negado!</strong><hr />");
                string msg = string.Empty;
                msg += "Você não tem permissão para acessar está página, entre em contato com o administrador do sistema.";
                alert.Add("erro", msg);
                alert.AlertType = AlertType.Error;
                alert.Show();
                return;
            }
            if ("ccs".Equals(this.Request["op"]))
            {
                Alert alert = new Alert("erroGeral", this);
                alert.Add("sucessoTitulo", "<strong>Parabéns!</strong><hr />");
                string msg = string.Empty;
                if (BasePage.CurrentLogin.TipoLogin == Lib.TipoLogin.Candidato)
                    msg += "Agora você candidato está apto a preencher seus dados curriculares, além disso seu perfíl será visto<br /> e poderá receber indicações as vagas aqui ofertadas.<br /> Seja bem vindo";
                else if (BasePage.CurrentLogin.TipoLogin == Lib.TipoLogin.Empresa)
                    msg += "Agora você empresário está apto à cadastrar novas vagas, a medida que surgirem candidatos que se enquarem AO perfíl de sua vaga o sistema irá indica-los e você será automaticamente notificado.<br /> Seja bem vindo";
                alert.Add("sucesso", "Seu cadastro foi completado com sucesso.<br />" + msg);
                alert.AlertType = AlertType.Success;
                alert.Show();
                return;
            }
            if (BasePage.IsAuthenticate && !BasePage.CurrentLogin.CadastroCompleto)
            {
                Alert alert = new Alert("erroGeral", this);
                alert.AlertType = AlertType.Warning;
                alert.AutoClose = false;
                alert.Add("title", "<strong>Cadastro Incompleto</strong><br /><hr />");
                alert.Add("mensagem", "Seja bem-vindo ao nosso sistema!<br />Detectados que seu cadastro não está completo," +
                    "para realizar qualquer operação dentro do sistema é necessário concluir esta etapa.<br />" +
                    "<a href=\"" + this.ResolveUrl("~/Views/Cadastros/Usuario.aspx?op=nc") + "\">Clique aqui</a> para concluir seu cadastro."
                    );
                alert.Show();
            }
            else if (BasePage.IsAuthenticate)
            {
                this.Notificacoes = Lib.Notificacao.Listar(new Lib.Notificacao()
                {
                    Visualizado = true,
                    LoginId = AppSession.Login.LoginId
                });
            }
            CarregarVagasAbertas();
        }

        protected void Vagas_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            RealizarInscricao(long.Parse(e.CommandArgument.ToString()));
            CarregarVagasAbertas();
        }

        private void CarregarVagasAbertas()
        {
            this.Vagas.DataSource = Lib.Vaga.ObterVagasAbertasParaInscricao(Lib.TipoVaga.Externo, ((AppSession.Login ?? new Lib.Login()).Usuario ?? new Lib.Usuario()).UsuarioId);
            this.Vagas.DataBind();
        }

        private void RealizarInscricao(long id)
        {
            Alert alert = new Alert("erroGeral", updVagas);
            try
            {
                var indicacao = new Lib.Indicacao();
                indicacao.UsuarioIndicadoId = AppSession.Login.Usuario.UsuarioId;
                indicacao.UsuarioIndicadorId = AppSession.Login.Usuario.UsuarioId;
                indicacao.Status = 2;
                indicacao.ResultadoFinal = 1;
                indicacao.VagaId = id;
                if (indicacao.Salvar())
                {
                    NotificarInscricao(id);
                    alert.Add("salvo", "Sua inscrição foi realizada com sucesso");
                    alert.AlertType = AlertType.Success;
                }
            }
            catch (Exception ex)
            {
                alert.Add("salvo", "Sua inscrição foi realizada com sucesso");
                alert.AlertType = AlertType.Error;
            }
            alert.Show();
        }

        protected void NotificarInscricao(long id)
        {
            var vaga = Lib.Vaga.Listar(new Lib.Vaga { VagaId = id }).FirstOrDefault();
            if (vaga != null)
            {
                Lib.Login login = new Lib.Login();
                login.LoginId = vaga.Usuario.LoginId;
                login.Notificar(new Lib.Notificacao()
                {
                    TipoNotificacao = "A",
                    Titulo = "INSCRIÇÃO DE CANDIDATO",
                    Menssagem = "O candidato <strong>" + AppSession.Login.Usuario.Nome + "</strong>,realizou a inscrição para o processo seletivo da vaga: <strong>" + vaga.Cargo.Nome + "</strong>"
                });
            }
        }

        [WebMethod]
        public static bool Login(string login, string senha)
        {
            if (string.IsNullOrWhiteSpace(login) || string.IsNullOrWhiteSpace(senha))
                return false;
            RzCorportativo.Lib.Login _login = new RzCorportativo.Lib.Login();
            _login.LoginText = login != null ? login.ToLower() : string.Empty;
            _login.Senha = EFramework.Web.Security.RijndaelSimple.Encrypt(senha);
            _login.Status = true;
            var itens = RzCorportativo.Lib.Login.Listar(_login);
            if (itens.FirstOrDefault() != null)
                BasePage.Autenticar(itens.FirstOrDefault());
            return string.IsNullOrWhiteSpace(_login.LoginText) || string.IsNullOrWhiteSpace(_login.Senha) || itens.Count == 1;
        }

        protected void btnCriarConta_Click(object sender, EventArgs e)
        {
            Alert alert = new Alert("erroGeral", this);
            try
            {
                alert.AlertType = AlertType.Error;
                if (!ServiceValidation.EmailIsValid(this.Email.Text, false))
                    alert.Add("email", "Email inválido");
                if (this.Senha.Text.Length.Equals(0))
                    alert.Add("senha", "Senha inválida");
                if (!this.Senha.Text.Equals(this.ConfirmarSenha.Text))
                    alert.Add("confirmaSenha", "Confirmação de senha inválida");
                if ((this.Perfil.SelectedValue ?? "0").Equals("0"))
                    alert.Add("email", "Perfíl inválido");
                var login = new Lib.Login();
                login.LoginText = this.Email.Text;
                login.Senha = EFramework.Web.Security.RijndaelSimple.Encrypt(this.Senha.Text);
                login.Status = true;

                login.TipoLogin = (Lib.TipoLogin)EFramework.Web.TypeExtension.ShortExtension.Parse(this.Perfil.SelectedValue, 0);
                if (!login.Salvar())
                    alert.Add("falha", "Desculpe isto é vergonhoso. Não foi possível realizar seu cadastro!</br>Tente novamente mais tarde");
                else
                {
                    login.Usuario = new Lib.Usuario();
                    BasePage.Autenticar(login);
                }
            }
            catch (Exception ex)
            {
                alert.Add("exception", "Desculpe isto é vergonhoso, a seguinte excessão foi disparada:</br>" + ex.Message);
            }
            if (alert.HasMessage)
                alert.Show();
            else
                this.Response.Redirect(this.ResolveUrl("~/Views/Cadastros/Usuario.aspx?op=nc"));
        }

        [WebMethod]
        public static int GetCount(int parametro)
        {
            return Lib.Notificacao.Listar(new Lib.Notificacao()
            {
                Visualizado = false,
                LoginId = parametro
            }).Count;
        }

        [WebMethod]
        public static List<Lib.Notificacao> GetNotificacoes(int parametro)
        {            
            var lista = Lib.Notificacao.Listar(new Lib.Notificacao()
            {
                //Visualizado = false,
                LoginId = parametro
            }).Take(10).ToList();
            HttpContext.Current.Session["$notificacoes"] = lista;
            return lista;
        }

        [WebMethod]
        public static bool ReadNotify(string identificador)
        {
            var lista = HttpContext.Current.Session["$notificacoes"] as List<Lib.Notificacao> ?? new List<Lib.Notificacao>();
            var notificacao = lista.FirstOrDefault(f => f.Identificador == Guid.Parse(identificador));
            if (lista != null)
            {
                notificacao = Lib.Notificacao.Listar(notificacao).FirstOrDefault();
                if (notificacao == null)
                    return false;
                notificacao.Visualizado = true;
                return notificacao.Salvar();
            }
            return false;
        }

        [WebMethod]
        public static object AlterarSenha(string senha, string novaSenha, string confirmaSenha)
        {
            try
            {
                if (AppSession.Login == null)
                    return new
                    {
                        AlertType = AlertType.Error,
                        Message = "Para realizar essa operação você precisa estar conectado, favor reconectar para alterar sua senha".Split(',')
                    };
                if (!AppSession.Login.Senha.Equals(EFramework.Web.Security.RijndaelSimple.Encrypt(senha)))
                    return new
                    {
                        AlertType = AlertType.Error,
                        Message = "Senha atual inválida".Split(',')
                    };
                if (!novaSenha.Equals(confirmaSenha))
                    return new
                    {
                        AlertType = AlertType.Error,
                        Message = "Confirmação de senha inválida".Split(',')
                    };
                var login = Lib.Login.CreateInstance(AppSession.Login.LoginId);
                login.Senha = EFramework.Web.Security.RijndaelSimple.Encrypt(novaSenha);
                if (login.Salvar())
                    return new
                    {
                        AlertType = AlertType.Success,
                        Message = "Senha alterada com sucesso".Split(',')
                    };
                return new
                {
                    AlertType = AlertType.Error,
                    Message = "Falha ao realizar a operação, tente mais tarde novamente".Split(',')
                };
            }
            catch (Exception ex)
            {
                return new
                {
                    AlertType = AlertType.Error,
                    Message = "Uma exceção ocorreu ao tentar realizar a operação," + ex.Message.Replace("\n", "<br />").Replace("\n", "<br />").Split(',')
                };
            }
        }

    }
}